package search

import (
	"fmt"
	"net/http"
	"net/url"
	"strings"

	"github.com/PuerkitoBio/goquery"
)

// BaiduResult 定义搜索结果结构体，与TypeScript类型对应
type BaiduResult struct {
	Title       string `json:"title"`
	URL         string `json:"url"`
	Description string `json:"description"`
	Source      string `json:"source"`
	Engine      string `json:"engine"`
}

// SearchBaidu 百度搜索函数，参数为查询词和结果数量限制
func SearchBaidu(query string, limit int) ([]BaiduResult, error) {
	var allResults []BaiduResult
	pn := 0 // 分页参数，百度每页约10条结果

	for len(allResults) < limit {
		// 构建查询参数
		params := url.Values{}
		params.Add("wd", query)
		params.Add("pn", fmt.Sprintf("%d", pn))
		params.Add("ie", "utf-8")
		params.Add("mod", "1")
		params.Add("isbd", "1")
		params.Add("isid", "f7ba1776007bcf9e")
		params.Add("oq", query)
		params.Add("tn", "88093251_62_hao_pg")
		params.Add("usm", "1")
		params.Add("fenlei", "256")
		params.Add("rsv_idx", "1")
		params.Add("rsv_pq", "f7ba1776007bcf9e")
		params.Add("rsv_t", "8179fxGiNMUh/0dXHrLsJXPlKYbkj9S5QH6rOLHY6pG6OGQ81YqzRTIGjjeMwEfiYQTSiTQIhCJj")
		params.Add("bs", query)
		params.Add("_ss", "1")
		params.Add("f4s", "1")
		params.Add("csor", "5")
		params.Add("_cr1", "30385")

		// 创建请求
		req, err := http.NewRequest("GET", "https://www.baidu.com/s?"+params.Encode(), nil)
		if err != nil {
			return nil, fmt.Errorf("创建请求失败: %w", err)
		}

		// 设置请求头
		req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")

		// 发送请求
		client := &http.Client{}
		resp, err := client.Do(req)
		if err != nil {
			return nil, fmt.Errorf("发送请求失败: %w", err)
		}
		defer resp.Body.Close()

		// 检查响应状态
		if resp.StatusCode != http.StatusOK {
			resp.Body.Close() // 确保关闭之前的响应体
			return nil, fmt.Errorf("请求失败，状态码: %d", resp.StatusCode)
		}

		// 解析HTML
		doc, err := goquery.NewDocumentFromReader(resp.Body)
		if err != nil {
			return nil, fmt.Errorf("解析HTML失败: %w", err)
		}

		var pageResults []BaiduResult

		// 提取搜索结果
		doc.Find("#content_left").Children().Each(func(i int, s *goquery.Selection) {
			titleElement := s.Find("h3")
			linkElement := s.Find("a")

			// 检查标题和链接元素是否存在
			if titleElement.Length() > 0 && linkElement.Length() > 0 {
				// 获取链接
				url, exists := linkElement.Attr("href")
				if !exists || !strings.HasPrefix(url, "http") {
					return // 跳过无效链接
				}

				// 提取描述信息
				snippetElementBaidu := s.Find(".c-font-normal.c-color-text").First()
				snippetElement := s.Find(".cos-row").First()
				description := ""

				if ariaLabel, exists := snippetElementBaidu.Attr("aria-label"); exists {
					description = ariaLabel
				} else if snippetElement.Length() > 0 {
					description = strings.TrimSpace(snippetElement.Text())
				}

				// 提取来源信息
				source := strings.TrimSpace(s.Find(".cosc-source").Text())

				// 添加到结果集
				pageResults = append(pageResults, BaiduResult{
					Title:       strings.TrimSpace(titleElement.Text()),
					URL:         url,
					Description: description,
					Source:      source,
					Engine:      "baidu",
				})
			}
		})

		// 合并结果
		allResults = append(allResults, pageResults...)

		// 如果当前页没有结果，提前结束
		if len(pageResults) == 0 {
			fmt.Println("⚠️ No more results, ending early....")
			break
		}

		// 准备下一页
		pn += 10
	}

	// 截取到指定数量的结果
	if len(allResults) > limit {
		allResults = allResults[:limit]
	}

	return allResults, nil
}
